<?php
//   +----------------------------------------------------------------------
//   | Copyright (c) 2015-2025 http://www.hdphp.cn All rights reserved.
//   | Licensed ( http://www.hdphp.cn/licenses/ )
//   | Author: Jack <sophia2152@qq.com>
//   | 官方网址: http://www.hdphp.cn
//   | 这不是一个自由软件！您只能在不用于商业目的的前提下对程序代码进行修改和使用。
//   | 任何企业和个人不允许对程序代码以任何形式任何目的再发布。
//   +----------------------------------------------------------------------
namespace hdphp\utils;

use think\Response;

/**
 * Class：Json输出类
 * 创建人：Jack
 * 创建时间：2023/7/27 11:11
 * @package hdphp\utils
 */
class Json
{
    private int $code = 200;

    /**
     * 注释：code
     * 创建人：Jack
     * 创建时间：2023/7/27 11:35
     * @param int $code
     * @return $this
     */
    public function code(int $code): self
    {
        $this->code = $code;
        return $this;
    }

    /**
     * 注释：make
     * 创建人：Jack
     * 创建时间：2023/7/27 11:34
     * @param int        $errcode
     * @param string     $errmsg
     * @param array|null $data
     * @param array|null $replace
     * @return Response
     */
    public function make(int $errcode, string $errmsg, ?array $data = null, ?array $replace = []): Response
    {
        $request = app()->request;
        $res = compact('errcode', 'errmsg');
        if (!is_null($data)) {
            $jsonData = json_encode($data);
            // 在debug关闭的时候返回压缩数据
            $compressData = null;
            if (strstr('/' . app()->request->rule()->getRule(), '/api/') !== false && strlen($jsonData) > 1024 && app()->config->get('cache.is_gzde', false)) {
                $compressData = $this->compress($data);
                $res['gzde'] = 1;
            }
            $res['data'] = $compressData ?: $data;
        }
        // 判断是否状态码
        if (is_numeric($res['errmsg'])) {
            $res['errcode'] = $res['errmsg'];
            $res['errmsg'] = getLang($res['errmsg'], $replace);
        }
        
        if ($res['errmsg'] && !is_numeric($res['errmsg'])) {
            if (!$range = $request->get('lang')) {
                $range = $request->cookie(config('lang.cookie_var'));
            }
            $langData = array_values(config('lang.accept_language', []));
            if (!in_array($range, $langData)) {
                $range = 'zh-cn';
            }

            $res['errmsg'] = lang($res['errmsg'], [], $range);
        }


        return Response::create($res, 'json', $this->code);
    }

    /**
     * 注释：success
     * 创建人：Jack
     * 创建时间：2023/7/27 11:35
     * @param            $errmsg
     * @param array|null $data
     * @param array|null $replace
     * @return Response
     */
    public function success($errmsg = 'success', ?array $data = null, ?array $replace = []): Response
    {
        if (is_array($errmsg)) {
            $data = $errmsg;
            $errmsg = 'success';
        }

        return $this->make(200, $errmsg, $data, $replace);
    }

    /**
     * 注释：fail
     * 创建人：Jack
     * 创建时间：2023/7/27 14:08
     * @param            $errmsg
     * @param array|null $data
     * @param array|null $replace
     * @return Response
     */
    public function fail($errmsg = 'error', ?array $data = null, ?array $replace = []): Response
    {
        if (is_array($errmsg)) {
            $data = $errmsg;
            $errmsg = 'error';
        }

        return $this->make(400, $errmsg, $data, $replace);
    }

    /**
     * 注释：status
     * 创建人：Jack
     * 创建时间：2023/7/27 14:08
     * @param            $errcode
     * @param            $errmsg
     * @param array|null $result
     * @return Response
     */
    public function status($errcode, $errmsg, ?array $result = []): Response
    {
        $errcode = strtoupper($errcode);
        if (is_array($errmsg)) {
            $result = $errmsg;
            $errmsg = 'success';
        }
        return $this->success($errmsg, compact('errcode', 'result'));
    }

    /**
     * 注释：compress
     * 创建人：Jack
     * 创建时间：2023/7/27 15:53
     * @param $str
     * @return string
     */
    protected function compress($str)
    {
        return base64_encode(gzdeflate(json_encode($str, JSON_UNESCAPED_UNICODE), 9));
    }
}